package com.zkh.myutils.io.excel.worksheet;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;

import com.zkh.myutils.utils.StringUtils;

/**
 * 单元格对象
 * @author zkh
 */
public class Cell {
	/**
	 * 字符串类型
	 */
	public static final int TYPE_STRING = 1;
	/**
	 * 数字类型
	 */
	public static final int TYPE_NUMBER = 2;
	/**
	 * 日期类型
	 */
	public static final int TYPE_DATE = 3;
	/**
	 * boolean类型
	 */
	public static final int TYPE_BOOL = 4;
	//基线日期
	private final static long base = LocalDate.of(1900, 1, 1).toEpochDay();
	
	/**
	 * 构造方法
	 */
	Cell() {}
	
	//单元格样式
	private CellStyle cellStyle;
	//单元格类型，默认字符串
	private int cellType = TYPE_STRING;
	//单元格值
	private BigDecimal numberValue;
	private String stringValue;
	//日期时间类型
	private boolean datetime;
	
	/**
	 * 设置单元格值，根据实际类型自动匹配Excel类型
	 * @param value 单元格值
	 */
	public void setCellValue(Object value) {
		//字符串
		if(value instanceof String) {
			this.stringValue = (String) value;
		}//数字
		else if(value instanceof Number) {
			this.numberValue = BigDecimal.valueOf(((Number) value).doubleValue());
			this.cellType = TYPE_NUMBER;
		}//日期
		else if(value instanceof Date) {
			//初始化
			Calendar calendar = Calendar.getInstance();
			calendar.setTime((Date) value);
			//获取小数部分（指定日期到19000101的天数）
			this.numberValue = BigDecimal.valueOf(LocalDate.of(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH)).toEpochDay() - base + 2);
			//时、分、秒
			int hour = calendar.get(Calendar.HOUR_OF_DAY);
			int minute = calendar.get(Calendar.MINUTE);
			int second = calendar.get(Calendar.SECOND);
			//保存小数部分
			BigDecimal fraction = BigDecimal.valueOf((hour*60*60 + minute*60 + second)/86400.0);
			//有小数部分
			if(fraction.compareTo(BigDecimal.ZERO)!=0) {
				this.datetime = true;
				this.numberValue = this.numberValue.add(fraction);
			}
			this.cellType = TYPE_DATE;
		}//布尔值
		else if(value instanceof Boolean) {
			this.numberValue = ((Boolean) value).booleanValue() ? BigDecimal.ONE : BigDecimal.ZERO;
			this.cellType = TYPE_BOOL;
		}//不为null
		else if(value!=null) {
			this.stringValue = value.toString();
		}
	}
	
	/**
	 * 设置单元格样式
	 */
	public void setCellStyle(CellStyle cellStyle) {
		this.cellStyle = cellStyle;
	}
	
	/**
	 * 获取单元格样式
	 */
	public CellStyle getCellStyle() {
		return this.cellStyle;
	}

	/**
	 * 获取单元格数据类型
	 */
	public int getCellType() {
		return cellType;
	}

	/**
	 * 获取数字类型值
	 */
	public BigDecimal getNumberValue() {
		return numberValue;
	}
	
	/**
	 * 获取数字类型转字符串值
	 */
	public String getNumberStringValue() {
		return numberValue==null ? null : numberValue.stripTrailingZeros().toPlainString();
	}

	/**
	 * 获取字符串类型值
	 */
	public String getStringValue() {
		return stringValue;
	}

	/**
	 * 显示日期时间格式
	 */
	public boolean isDatetime() {
		return datetime;
	}
	
	/**
	 * 值是否为空
	 */
	public boolean isEmpty() {
		return cellType==Cell.TYPE_STRING && StringUtils.isEmpty(stringValue)
				|| cellType!=Cell.TYPE_STRING && numberValue==null;
	}
	
	/**
	 * 清空值（内部调用）
	 */
	public void clearValue() {
		this.numberValue = null;
		this.stringValue = null;
	}
}
